package com.prim.update.impl;

import android.text.TextUtils;
import android.util.Log;

import com.prim.update.model.UpdateInfo;
import com.prim.update.interfaces.IUpdateExplorer;
import com.prim.update.interfaces.IUpdatePlan;
import com.prim.update.state.StateType;
import com.prim.update.state.UpdateState;
import com.prim.update.utils.FileUtils;
import com.prim.update.utils.SPUtils;
import com.prim.update.utils.Utils;

/**
 * ================================================
 * 作    者：linksus
 * 版    本：1.0
 * 创建日期：3/5 0005
 * 描    述：对bean 采取方案的实现者
 * 不同的业务实现逻辑不同，可重写此方法
 * 修订历史：
 * ================================================
 */
public class UpdatePlaner implements IUpdatePlan {
    private static final String TAG = "UpdatePlaner";

    @Override
    public void plan(UpdateInfo info, IUpdateExplorer explorer) {
        Log.e(TAG, "plan: " + info);
        UpdateState.setState(StateType.PLAN);
        if (info == null) {
            explorer.stop();
            return;
        }
        if (info.isNoUpdate()) {//不需要更新,终止任务
            explorer.stop();
        } else {//需要更新
            //判断用户是否忽略了更新 如果用户忽略了更新不再提示该版本 任务终止
            if (SPUtils.getInstance("ignore").getBoolean(info.getVersion_name(), false)) {
                if (explorer.getBuilder().isIgnorable) {
                    explorer.stop();
                    explorer.showToast("已忽略该版本:" + info.getVersion_name());
                    return;
                } else {
                    SPUtils.getInstance("ignore").clear();
                }
            }
            //如果用户没有忽略更新
            //1 先判断最新的apk包是否存在
            //2 存储第一次更新UI提示时间
            //3 获取服务器返回的提示周期或者是一天内的提示次数,具体规则根据业务需求定制
            if (explorer.isApkCompleteExits()) {// 最新apk存在
                 /* 用户是否设置了强制重新下载 */
                if (explorer.getBuilder().isDownloadAgain) {
                    FileUtils.deleteFile(explorer.getDownloadPath());
                    explorer.doPrompter(UpdateExplorer.PrompterType.update);//更新提示
                } else {
                    explorer.doPrompter(UpdateExplorer.PrompterType.install);//安装UI提示
                }
            } else if (explorer.isAutoDownload()) {// 发现新版本自动下载apk
                explorer.doDownload();// 不需要任何UI提示
            } else {
                serverUpdateTime(info, explorer);
            }
        }
    }

    /** 根据更新UI提示的时间 */
    private void serverUpdateTime(UpdateInfo info, IUpdateExplorer explorer) {
        if (!explorer.getBuilder().isCycleUpdatePrompter) {//没有开启周期UI提示
            explorer.doPrompter(UpdateExplorer.PrompterType.update);//更新UI提示
            SPUtils.getInstance("Update").clear();
            return;
        }
        String logUpdateTime = SPUtils.getInstance("Update").getString(info.getVersion_name());
        if (TextUtils.isEmpty(logUpdateTime)) {// 第一次提示
            explorer.doPrompter(UpdateExplorer.PrompterType.update);//更新UI提示
            //记录当前提示的时间
            SPUtils.getInstance("Update").put(info.getVersion_name(), String.valueOf(System.currentTimeMillis()));
        } else {// 第二次提示
            if (explorer.getBuilder().prompterPriority) {//true 手动设置的优先级高 以手动设置的时间为准
                if (explorer.getBuilder().prompterTime == -1) {//若没有设置手动时间以服务器时间为准
                    checkTime(info, explorer, logUpdateTime, info.getTime());
                } else {//如果设置了手动时间
                    checkTime(info, explorer, logUpdateTime, explorer.getBuilder().prompterTime);
                }
            } else {
                checkTime(info, explorer, logUpdateTime, info.getTime());
            }

        }
    }

    /** 检查时间 */
    private void checkTime(UpdateInfo info, IUpdateExplorer explorer, String logUpdateTime, int time) {
        if (Utils.getUpdateTime(logUpdateTime, time)) {//已超过设定的提示时间
            explorer.doPrompter(UpdateExplorer.PrompterType.update);//更新UI提示
            //记录当前提示的时间
            SPUtils.getInstance("Update").put(info.getVersion_name(), String.valueOf(System.currentTimeMillis()));
        } else {
            explorer.showToast("没有超过设定的提示周期:" + time + "天");
            explorer.stop();
        }
    }

}
